/*
 * Copyright 2007 National Bioinformatics Network
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package dgbgui.gui.event;

import java.awt.event.InputEvent;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

import dgbgui.gui.widgets.Widget;
import dgbgui.gui.widgets.visual.TitleBarWidget;
import dgbgui.gui.widgets.visual.modeldriven.ModelDrivenConceptWidget;
import dgbgui.gui.widgets.visual.results.ConceptronInstanceResultWidget;
import dgbgui.gui.widgets.visual.results.ConceptronTypeResultWidget;
import edu.umd.cs.piccolo.event.PBasicInputEventHandler;
import edu.umd.cs.piccolo.event.PInputEvent;
import edu.umd.cs.piccolo.event.PInputEventFilter;


// TODO: Refactor the duplicated code in this and the group selection event handler 
public class SelectionEventHandler extends PBasicInputEventHandler implements
        CheckConsumedInputEventHandler {

    public SelectionEventHandler() {
        setEventFilter(new PInputEventFilter(InputEvent.BUTTON1_MASK));
    }
    
    public void mousePressed(PInputEvent event) {
      
        if ( event.getClickCount() == 1 ) {

            LinkedHashSet<Class> objectPreference = getObjectPreference();
            Widget preferredObj = Widget.findPreferencialObject((event.getCamera().pick(
                    event.getCanvasPosition().getX(),
                    event.getCanvasPosition().getY(),
                    1)).getNodeStackReference(),
                    objectPreference);

            Set<Widget> widgets = new HashSet<Widget>();
            if ( preferredObj != null ) {
                widgets.add(preferredObj);
            }
            SelectionConstructor.setSelection(event,widgets);
        }
        // Do not set processed to true, as selection eent fall through the event handling,
        // to enable for example dragging of selected items (the item need to be selected first,
        // then the event falls through to the drag ecvent handler
        //m_processed = true;
    }
      
    public LinkedHashSet<Class> getObjectPreference() {
        LinkedHashSet<Class> objectPreference = new LinkedHashSet<Class>();
        objectPreference.add(TitleBarWidget.class);
        objectPreference.add(ConceptronTypeResultWidget.class);
        objectPreference.add(ConceptronInstanceResultWidget.class);
        objectPreference.add(ModelDrivenConceptWidget.class);
        return objectPreference;
    }

    
    public boolean eventProcessed(PInputEvent event, int type) {
        m_processed = false;
        processEvent(event,type);
        return m_processed;
    }
    

    
    boolean m_processed = false;

}
